| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426 | 1
1
144
1
1
129
1
261
1
54
1
1
1
1
1
86
1
1
1
90
90
90
1
1
40
40
1
10
10
1
1
1
1
1
27
1
27
27
27
27
89
89
27
1
1
1
1
27
27
27
27
27
27
1
116
41
27
27
14
89
40
49
1
48
48
3
3
36
9
1
36
36
36
1
1
1
40
40
40
40
221
40
40
40
40
40
1
1
1
1
1
1
1
1
1
1
1
1
9
9
9
9
9
9
9
27
27
27
9
9
9
9
9
9
1
373
27
346
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
| System.register([], function (_export) {
'use strict';
var Token, Lexer, Scanner, OPERATORS, $EOF, $TAB, $LF, $VTAB, $FF, $CR, $SPACE, $BANG, $DQ, $$, $PERCENT, $AMPERSAND, $SQ, $LPAREN, $RPAREN, $STAR, $PLUS, $COMMA, $MINUS, $PERIOD, $SLASH, $COLON, $SEMICOLON, $LT, $EQ, $GT, $QUESTION, $0, $9, $A, $E, $Z, $LBRACKET, $BACKSLASH, $RBRACKET, $CARET, $_, $a, $e, $f, $n, $r, $t, $u, $v, $z, $LBRACE, $BAR, $RBRACE, $NBSP;
function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function isWhitespace(code) {
return code >= $TAB && code <= $SPACE || code === $NBSP;
}
function isIdentifierStart(code) {
return $a <= code && code <= $z || $A <= code && code <= $Z || code === $_ || code === $$;
}
function isIdentifierPart(code) {
return $a <= code && code <= $z || $A <= code && code <= $Z || $0 <= code && code <= $9 || code === $_ || code === $$;
}
function isDigit(code) {
return $0 <= code && code <= $9;
}
function isExponentStart(code) {
return code === $e || code === $E;
}
function isExponentSign(code) {
return code === $MINUS || code === $PLUS;
}
function unescape(code) {
switch (code) {
case $n:
return $LF;
case $f:
return $FF;
case $r:
return $CR;
case $t:
return $TAB;
case $v:
return $VTAB;
default:
return code;
}
}
function assert(condition, message) {
Iif (!condition) {
throw message || 'Assertion failed';
}
}
return {
setters: [],
execute: function () {
Token = (function () {
function Token(index, text) {
_classCallCheck(this, Token);
this.index = index;
this.text = text;
}
Token.prototype.withOp = function withOp(op) {
this.opKey = op;
return this;
};
Token.prototype.withGetterSetter = function withGetterSetter(key) {
this.key = key;
return this;
};
Token.prototype.withValue = function withValue(value) {
this.value = value;
return this;
};
Token.prototype.toString = function toString() {
return 'Token(' + this.text + ')';
};
return Token;
})();
_export('Token', Token);
Lexer = (function () {
function Lexer() {
_classCallCheck(this, Lexer);
}
Lexer.prototype.lex = function lex(text) {
var scanner = new Scanner(text);
var tokens = [];
var token = scanner.scanToken();
while (token) {
tokens.push(token);
token = scanner.scanToken();
}
return tokens;
};
return Lexer;
})();
_export('Lexer', Lexer);
Scanner = (function () {
function Scanner(input) {
_classCallCheck(this, Scanner);
this.input = input;
this.length = input.length;
this.peek = 0;
this.index = -1;
this.advance();
}
Scanner.prototype.scanToken = function scanToken() {
// Skip whitespace.
while (this.peek <= $SPACE) {
if (++this.index >= this.length) {
this.peek = $EOF;
return null;
} else {
this.peek = this.input.charCodeAt(this.index);
}
}
// Handle identifiers and numbers.
if (isIdentifierStart(this.peek)) {
return this.scanIdentifier();
}
if (isDigit(this.peek)) {
return this.scanNumber(this.index);
}
var start = this.index;
switch (this.peek) {
case $PERIOD:
this.advance();
return isDigit(this.peek) ? this.scanNumber(start) : new Token(start, '.');
case $LPAREN:
case $RPAREN:
case $LBRACE:
case $RBRACE:
case $LBRACKET:
case $RBRACKET:
case $COMMA:
case $COLON:
case $SEMICOLON:
return this.scanCharacter(start, String.fromCharCode(this.peek));
case $SQ:
case $DQ:
return this.scanString();
case $PLUS:
case $MINUS:
case $STAR:
case $SLASH:
case $PERCENT:
case $CARET:
case $QUESTION:
return this.scanOperator(start, String.fromCharCode(this.peek));
case $LT:
case $GT:
case $BANG:
case $EQ:
return this.scanComplexOperator(start, $EQ, String.fromCharCode(this.peek), '=');
case $AMPERSAND:
return this.scanComplexOperator(start, $AMPERSAND, '&', '&');
case $BAR:
return this.scanComplexOperator(start, $BAR, '|', '|');
case $NBSP:
while (isWhitespace(this.peek)) {
this.advance();
}
return this.scanToken();
}
var character = String.fromCharCode(this.peek);
this.error('Unexpected character [' + character + ']');
return null;
};
Scanner.prototype.scanCharacter = function scanCharacter(start, text) {
assert(this.peek === text.charCodeAt(0));
this.advance();
return new Token(start, text);
};
Scanner.prototype.scanOperator = function scanOperator(start, text) {
assert(this.peek === text.charCodeAt(0));
assert(OPERATORS.indexOf(text) !== -1);
this.advance();
return new Token(start, text).withOp(text);
};
Scanner.prototype.scanComplexOperator = function scanComplexOperator(start, code, one, two) {
assert(this.peek === one.charCodeAt(0));
this.advance();
var text = one;
if (this.peek === code) {
this.advance();
text += two;
}
if (this.peek === code) {
this.advance();
text += two;
}
assert(OPERATORS.indexOf(text) != -1);
return new Token(start, text).withOp(text);
};
Scanner.prototype.scanIdentifier = function scanIdentifier() {
assert(isIdentifierStart(this.peek));
var start = this.index;
this.advance();
while (isIdentifierPart(this.peek)) {
this.advance();
}
var text = this.input.substring(start, this.index);
var result = new Token(start, text);
// TODO(kasperl): Deal with null, undefined, true, and false in
// a cleaner and faster way.
Iif (OPERATORS.indexOf(text) !== -1) {
result.withOp(text);
} else {
result.withGetterSetter(text);
}
return result;
};
Scanner.prototype.scanNumber = function scanNumber(start) {
assert(isDigit(this.peek));
var simple = this.index === start;
this.advance(); // Skip initial digit.
while (true) {
Iif (isDigit(this.peek)) {} else Iif (this.peek === $PERIOD) {
simple = false;
} else Iif (isExponentStart(this.peek)) {
this.advance();
if (isExponentSign(this.peek)) {
this.advance();
}
if (!isDigit(this.peek)) {
this.error('Invalid exponent', -1);
}
simple = false;
} else {
break;
}
this.advance();
}
var text = this.input.substring(start, this.index);
var value = simple ? parseInt(text) : parseFloat(text);
return new Token(start, text).withValue(value);
};
Scanner.prototype.scanString = function scanString() {
assert(this.peek === $SQ || this.peek === $DQ);
var start = this.index;
var quote = this.peek;
this.advance(); // Skip initial quote.
var buffer;
var marker = this.index;
while (this.peek !== quote) {
Iif (this.peek === $BACKSLASH) {
if (buffer === null) {
buffer = [];
}
buffer.push(this.input.substring(marker, this.index));
this.advance();
var unescaped;
if (this.peek === $u) {
// TODO(kasperl): Check bounds? Make sure we have test
// coverage for this.
var hex = this.input.substring(this.index + 1, this.index + 5);
if (!/[A-Z0-9]{4}/.test(hex)) {
this.error('Invalid unicode escape [\\u' + hex + ']');
}
unescaped = parseInt(hex, 16);
for (var i = 0; i < 5; ++i) {
this.advance();
}
} else {
unescaped = decodeURIComponent(this.peek);
this.advance();
}
buffer.push(String.fromCharCode(unescaped));
marker = this.index;
} else Iif (this.peek === $EOF) {
this.error('Unterminated quote');
} else {
this.advance();
}
}
var last = this.input.substring(marker, this.index);
this.advance(); // Skip terminating quote.
var text = this.input.substring(start, this.index);
// Compute the unescaped string value.
var unescaped = last;
Iif (buffer != null) {
buffer.push(last);
unescaped = buffer.join('');
}
return new Token(start, text).withValue(unescaped);
};
Scanner.prototype.advance = function advance() {
if (++this.index >= this.length) {
this.peek = $EOF;
} else {
this.peek = this.input.charCodeAt(this.index);
}
};
Scanner.prototype.error = function error(message) {
var offset = arguments[1] === undefined ? 0 : arguments[1];
// TODO(kasperl): Try to get rid of the offset. It is only used to match
// the error expectations in the lexer tests for numbers with exponents.
var position = this.index + offset;
throw new Error('Lexer Error: ' + message + ' at column ' + position + ' in expression [' + this.input + ']');
};
return Scanner;
})();
_export('Scanner', Scanner);
OPERATORS = ['undefined', 'null', 'true', 'false', '+', '-', '*', '/', '%', '^', '=', '==', '===', '!=', '!==', '<', '>', '<=', '>=', '&&', '||', '&', '|', '!', '?'];
$EOF = 0;
$TAB = 9;
$LF = 10;
$VTAB = 11;
$FF = 12;
$CR = 13;
$SPACE = 32;
$BANG = 33;
$DQ = 34;
$$ = 36;
$PERCENT = 37;
$AMPERSAND = 38;
$SQ = 39;
$LPAREN = 40;
$RPAREN = 41;
$STAR = 42;
$PLUS = 43;
$COMMA = 44;
$MINUS = 45;
$PERIOD = 46;
$SLASH = 47;
$COLON = 58;
$SEMICOLON = 59;
$LT = 60;
$EQ = 61;
$GT = 62;
$QUESTION = 63;
$0 = 48;
$9 = 57;
$A = 65;
$E = 69;
$Z = 90;
$LBRACKET = 91;
$BACKSLASH = 92;
$RBRACKET = 93;
$CARET = 94;
$_ = 95;
$a = 97;
$e = 101;
$f = 102;
$n = 110;
$r = 114;
$t = 116;
$u = 117;
$v = 118;
$z = 122;
$LBRACE = 123;
$BAR = 124;
$RBRACE = 125;
$NBSP = 160;
}
};
});
// Do nothing.
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL2JpbmRpbmcvc3JjL2xleGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztNQUFhLEtBQUssRUEwQkwsS0FBSyxFQWVMLE9BQU8sRUE0UGhCLFNBQVMsRUE0QlQsSUFBSSxFQUNKLElBQUksRUFDSixHQUFHLEVBQ0gsS0FBSyxFQUNMLEdBQUcsRUFDSCxHQUFHLEVBQ0gsTUFBTSxFQUNOLEtBQUssRUFDTCxHQUFHLEVBQ0gsRUFBRSxFQUNGLFFBQVEsRUFDUixVQUFVLEVBQ1YsR0FBRyxFQUNILE9BQU8sRUFDUCxPQUFPLEVBQ1AsS0FBSyxFQUNMLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLE9BQU8sRUFDUCxNQUFNLEVBQ04sTUFBTSxFQUNOLFVBQVUsRUFDVixHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxTQUFTLEVBRVQsRUFBRSxFQUNGLEVBQUUsRUFFRixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFFRixTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsRUFDVCxNQUFNLEVBQ04sRUFBRSxFQUVGLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxFQUVGLE9BQU8sRUFDUCxJQUFJLEVBQ0osT0FBTyxFQUNQLEtBQUs7Ozs7QUFFVCxXQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUU7QUFDMUIsV0FBTyxBQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBTSxJQUFJLEtBQUssS0FBSyxBQUFDLENBQUM7R0FDN0Q7O0FBRUQsV0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUU7QUFDL0IsV0FBTyxBQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsSUFDeEIsRUFB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ZixTQUFHLEdBQVUsRUFBRTtBQUNmLFNBQUcsR0FBVSxFQUFFO0FBQ2YsZUFBUyxHQUFJLEVBQUU7QUFFZixRQUFFLEdBQUcsRUFBRTtBQUNQLFFBQUUsR0FBRyxFQUFFO0FBRVAsUUFBRSxHQUFHLEVBQUU7QUFDUCxRQUFFLEdBQUcsRUFBRTtBQUNQLFFBQUUsR0FBRyxFQUFFO0FBRVAsZUFBUyxHQUFJLEVBQUU7QUFDZixnQkFBVSxHQUFHLEVBQUU7QUFDZixlQUFTLEdBQUksRUFBRTtBQUNmLFlBQU0sR0FBTyxFQUFFO0FBQ2YsUUFBRSxHQUFXLEVBQUU7QUFFZixRQUFFLEdBQUcsRUFBRTtBQUNQLFFBQUUsR0FBRyxHQUFHO0FBQ1IsUUFBRSxHQUFHLEdBQUc7QUFDUixRQUFFLEdBQUcsR0FBRztBQUNSLFFBQUUsR0FBRyxHQUFHO0FBQ1IsUUFBRSxHQUFHLEdBQUc7QUFDUixRQUFFLEdBQUcsR0FBRztBQUNSLFFBQUUsR0FBRyxHQUFHO0FBQ1IsUUFBRSxHQUFHLEdBQUc7QUFFUixhQUFPLEdBQUcsR0FBRztBQUNiLFVBQUksR0FBTSxHQUFHO0FBQ2IsYUFBTyxHQUFHLEdBQUc7QUFDYixXQUFLLEdBQUssR0FBRyIsImZpbGUiOiIvVXNlcnMvRWlzZW5iZXJnRWZmZWN0L0RvY3VtZW50cy9HaXRIdWIvVGhlIER1cmFuZGFsIFByb2plY3QvYXVyZWxpYS9iaW5kaW5nL3NyYy9sZXhlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKGluZGV4LCB0ZXh0KXtcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgfVxuXG4gIHdpdGhPcChvcCkge1xuICAgIHRoaXMub3BLZXkgPSBvcDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdpdGhHZXR0ZXJTZXR0ZXIoa2V5KSB7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aXRoVmFsdWUodmFsdWUpIHsgXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlOyBcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgVG9rZW4oJHt0aGlzLnRleHR9KWA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExleGVyIHtcbiAgbGV4KHRleHQpIHtcbiAgICB2YXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKHRleHQpO1xuICAgIHZhciB0b2tlbnMgPSBbXTtcbiAgICB2YXIgdG9rZW4gPSBzY2FubmVyLnNjYW5Ub2tlbigpO1xuXG4gICAgd2hpbGUgKHRva2VuKSB7XG4gICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICB0b2tlbiA9IHNjYW5uZXIuc2NhblRva2VuKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2Nhbm5lciB7XG4gIGNvbnN0cnVjdG9yKGlucHV0KSB7XG4gICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgIHRoaXMubGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgIHRoaXMucGVlayA9IDA7XG4gICAgdGhpcy5pbmRleCA9IC0xO1xuXG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gIH1cblxuICBzY2FuVG9rZW4oKSB7XG4gICAgLy8gU2tpcCB3aGl0ZXNwYWNlLlxuICAgIHdoaWxlICh0aGlzLnBlZWsgPD0gJFNQQUNFKSB7XG4gICAgICBpZiAoKyt0aGlzLmluZGV4ID49IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucGVlayA9ICRFT0Y7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wZWVrID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpZGVudGlmaWVycyBhbmQgbnVtYmVycy5cbiAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQodGhpcy5wZWVrKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NhbklkZW50aWZpZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaWdpdCh0aGlzLnBlZWspKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2FuTnVtYmVyKHRoaXMuaW5kZXgpO1xuICAgIH1cblxuICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXg7XG5cbiAgICBzd2l0Y2ggKHRoaXMucGVlaykge1xuICAgICAgY2FzZSAkUEVSSU9EOlxuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgcmV0dXJuIGlzRGlnaXQodGhpcy5wZWVrKSA/IHRoaXMuc2Nhbk51bWJlcihzdGFydCkgOiBuZXcgVG9rZW4oc3RhcnQsICcuJyk7XG4gICAgICBjYXNlICRMUEFSRU46XG4gICAgICBjYXNlICRSUEFSRU46XG4gICAgICBjYXNlICRMQlJBQ0U6XG4gICAgICBjYXNlICRSQlJBQ0U6XG4gICAgICBjYXNlICRMQlJBQ0tFVDpcbiAgICAgIGNhc2UgJFJCUkFDS0VUOlxuICAgICAgY2FzZSAkQ09NTUE6XG4gICAgICBjYXNlICRDT0xPTjpcbiAgICAgIGNhc2UgJFNFTUlDT0xPTjpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbkNoYXJhY3RlcihzdGFydCwgU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnBlZWspKTtcbiAgICAgIGNhc2UgJFNROlxuICAgICAgY2FzZSAkRFE6XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5TdHJpbmcoKTtcbiAgICAgIGNhc2UgJFBMVVM6XG4gICAgICBjYXNlICRNSU5VUzpcbiAgICAgIGNhc2UgJFNUQVI6XG4gICAgICBjYXNlICRTTEFTSDpcbiAgICAgIGNhc2UgJFBFUkNFTlQ6XG4gICAgICBjYXNlICRDQVJFVDpcbiAgICAgIGNhc2UgJFFVRVNUSU9OOlxuICAgICAgICByZXR1cm4gdGhpcy5zY2FuT3BlcmF0b3Ioc3RhcnQsIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5wZWVrKSk7XG4gICAgICBjYXNlICRMVDpcbiAgICAgIGNhc2UgJEdUOlxuICAgICAgY2FzZSAkQkFORzpcbiAgICAgIGNhc2UgJEVROlxuICAgICAgICByZXR1cm4gdGhpcy5zY2FuQ29tcGxleE9wZXJhdG9yKHN0YXJ0LCAkRVEsIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5wZWVrKSwgJz0nKTtcbiAgICAgIGNhc2UgJEFNUEVSU0FORDpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbkNvbXBsZXhPcGVyYXRvcihzdGFydCwgJEFNUEVSU0FORCwgJyYnLCAnJicpO1xuICAgICAgY2FzZSAkQkFSOlxuICAgICAgICByZXR1cm4gdGhpcy5zY2FuQ29tcGxleE9wZXJhdG9yKHN0YXJ0LCAkQkFSLCAnfCcsICd8Jyk7XG4gICAgICBjYXNlICROQlNQOlxuICAgICAgICB3aGlsZSAoaXNXaGl0ZXNwYWNlKHRoaXMucGVlaykpe1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VuKCk7XG4gICAgfVxuXG4gICAgdmFyIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5wZWVrKTtcbiAgICB0aGlzLmVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBbJHtjaGFyYWN0ZXJ9XWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc2NhbkNoYXJhY3RlcihzdGFydCwgdGV4dCkge1xuICAgIGFzc2VydCh0aGlzLnBlZWsgPT09IHRleHQuY2hhckNvZGVBdCgwKSk7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIG5ldyBUb2tlbihzdGFydCwgdGV4dCk7XG4gIH1cblxuICBzY2FuT3BlcmF0b3Ioc3RhcnQsIHRleHQpIHtcbiAgICBhc3NlcnQodGhpcy5wZWVrID09PSB0ZXh0LmNoYXJDb2RlQXQoMCkpO1xuICAgIGFzc2VydChPUEVSQVRPUlMuaW5kZXhPZih0ZXh0KSAhPT0gLTEpO1xuICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIHJldHVybiBuZXcgVG9rZW4oc3RhcnQsIHRleHQpLndpdGhPcCh0ZXh0KTtcbiAgfVxuXG4gIHNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsIGNvZGUsIG9uZSwgdHdvKSB7XG4gICAgYXNzZXJ0KHRoaXMucGVlayA9PT0gb25lLmNoYXJDb2RlQXQoMCkpO1xuICAgIHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgdmFyIHRleHQgPSBvbmU7XG4gICAgXG4gICAgaWYgKHRoaXMucGVlayA9PT0gY29kZSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB0ZXh0ICs9IHR3bztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wZWVrID09PSBjb2RlKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHRleHQgKz0gdHdvO1xuICAgIH1cblxuICAgIGFzc2VydChPUEVSQVRPUlMuaW5kZXhPZih0ZXh0KSAhPSAtMSk7XG5cbiAgICByZXR1cm4gbmV3IFRva2VuKHN0YXJ0LCB0ZXh0KS53aXRoT3AodGV4dCk7XG4gIH1cblxuICBzY2FuSWRlbnRpZmllcigpIHtcbiAgICBhc3NlcnQoaXNJZGVudGlmaWVyU3RhcnQodGhpcy5wZWVrKSk7XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblxuICAgIHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgd2hpbGUgKGlzSWRlbnRpZmllclBhcnQodGhpcy5wZWVrKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuXG4gICAgdmFyIHRleHQgPSB0aGlzLmlucHV0LnN1YnN0cmluZyhzdGFydCwgdGhpcy5pbmRleCk7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBUb2tlbihzdGFydCwgdGV4dCk7XG5cbiAgICAvLyBUT0RPKGthc3BlcmwpOiBEZWFsIHdpdGggbnVsbCwgdW5kZWZpbmVkLCB0cnVlLCBhbmQgZmFsc2UgaW5cbiAgICAvLyBhIGNsZWFuZXIgYW5kIGZhc3RlciB3YXkuXG4gICAgaWYgKE9QRVJBVE9SUy5pbmRleE9mKHRleHQpICE9PSAtMSkge1xuICAgICAgcmVzdWx0LndpdGhPcCh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LndpdGhHZXR0ZXJTZXR0ZXIodGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHNjYW5OdW1iZXIoc3RhcnQpIHtcbiAgICBhc3NlcnQoaXNEaWdpdCh0aGlzLnBlZWspKTtcbiAgICB2YXIgc2ltcGxlID0gKHRoaXMuaW5kZXggPT09IHN0YXJ0KTtcbiAgICB0aGlzLmFkdmFuY2UoKTsgIC8vIFNraXAgaW5pdGlhbCBkaWdpdC5cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoaXNEaWdpdCh0aGlzLnBlZWspKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGVlayA9PT0gJFBFUklPRCkge1xuICAgICAgICBzaW1wbGUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNFeHBvbmVudFN0YXJ0KHRoaXMucGVlaykpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG5cbiAgICAgICAgaWYgKGlzRXhwb25lbnRTaWduKHRoaXMucGVlaykpe1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0RpZ2l0KHRoaXMucGVlaykpe1xuICAgICAgICAgIHRoaXMuZXJyb3IoJ0ludmFsaWQgZXhwb25lbnQnLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHNpbXBsZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cblxuICAgIHZhciB0ZXh0ID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcoc3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgIHZhciB2YWx1ZSA9IHNpbXBsZSA/IHBhcnNlSW50KHRleHQpIDogcGFyc2VGbG9hdCh0ZXh0KTtcbiAgICByZXR1cm4gbmV3IFRva2VuKHN0YXJ0LCB0ZXh0KS53aXRoVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgc2NhblN0cmluZygpIHtcbiAgICBhc3NlcnQodGhpcy5wZWVrID09PSAkU1EgfHwgdGhpcy5wZWVrID09PSAkRFEpO1xuICAgIFxuICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgdmFyIHF1b3RlID0gdGhpcy5wZWVrO1xuXG4gICAgdGhpcy5hZHZhbmNlKCk7ICAvLyBTa2lwIGluaXRpYWwgcXVvdGUuXG5cbiAgICB2YXIgYnVmZmVyO1xuICAgIHZhciBtYXJrZXIgPSB0aGlzLmluZGV4O1xuXG4gICAgd2hpbGUgKHRoaXMucGVlayAhPT0gcXVvdGUpIHtcbiAgICAgIGlmICh0aGlzLnBlZWsgPT09ICRCQUNLU0xBU0gpIHtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgYnVmZmVyLnB1c2godGhpcy5pbnB1dC5zdWJzdHJpbmcobWFya2VyLCB0aGlzLmluZGV4KSk7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgICAgIHZhciB1bmVzY2FwZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMucGVlayA9PT0gJHUpIHtcbiAgICAgICAgICAvLyBUT0RPKGthc3BlcmwpOiBDaGVjayBib3VuZHM/IE1ha2Ugc3VyZSB3ZSBoYXZlIHRlc3RcbiAgICAgICAgICAvLyBjb3ZlcmFnZSBmb3IgdGhpcy5cbiAgICAgICAgICB2YXIgaGV4ID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcodGhpcy5pbmRleCArIDEsIHRoaXMuaW5kZXggKyA1KTtcblxuICAgICAgICAgIGlmKCEvW0EtWjAtOV17NH0vLnRlc3QoaGV4KSl7XG4gICAgICAgICAgICB0aGlzLmVycm9yKGBJbnZhbGlkIHVuaWNvZGUgZXNjYXBlIFtcXFxcdSR7aGV4fV1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1bmVzY2FwZWQgPSBwYXJzZUludChoZXgsIDE2KTtcbiAgICAgICAgICBcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDU7ICsraSkge1xuICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuZXNjYXBlZCA9IGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLnBlZWspO1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnVmZmVyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh1bmVzY2FwZWQpKTtcbiAgICAgICAgbWFya2VyID0gdGhpcy5pbmRleDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrID09PSAkRU9GKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoJ1VudGVybWluYXRlZCBxdW90ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxhc3QgPSB0aGlzLmlucHV0LnN1YnN0cmluZyhtYXJrZXIsIHRoaXMuaW5kZXgpO1xuICAgIHRoaXMuYWR2YW5jZSgpOyAgLy8gU2tpcCB0ZXJtaW5hdGluZyBxdW90ZS5cbiAgICB2YXIgdGV4dCA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCB0aGlzLmluZGV4KTtcblxuICAgIC8vIENvbXB1dGUgdGhlIHVuZXNjYXBlZCBzdHJpbmcgdmFsdWUuXG4gICAgdmFyIHVuZXNjYXBlZCA9IGxhc3Q7XG5cbiAgICBpZiAoYnVmZmVyICE9IG51bGwpIHtcbiAgICAgIGJ1ZmZlci5wdXNoKGxhc3QpO1xuICAgICAgdW5lc2NhcGVkID0gYnVmZmVyLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVG9rZW4oc3RhcnQsIHRleHQpLndpdGhWYWx1ZSh1bmVzY2FwZWQpO1xuICB9XG5cbiAgYWR2YW5jZSgpIHtcbiAgICBpZiAoKyt0aGlzLmluZGV4ID49IHRoaXMubGVuZ3RoKXtcbiAgICAgIHRoaXMucGVlayA9ICRFT0Y7XG4gICAgfWVsc2Uge1xuICAgICAgdGhpcy5wZWVrID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2UsIG9mZnNldD0wKSB7XG4gICAgLy8gVE9ETyhrYXNwZXJsKTogVHJ5IHRvIGdldCByaWQgb2YgdGhlIG9mZnNldC4gSXQgaXMgb25seSB1c2VkIHRvIG1hdGNoXG4gICAgLy8gdGhlIGVycm9yIGV4cGVjdGF0aW9ucyBpbiB0aGUgbGV4ZXIgdGVzdHMgZm9yIG51bWJlcnMgd2l0aCBleHBvbmVudHMuXG4gICAgdmFyIHBvc2l0aW9uID0gdGhpcy5pbmRleCArIG9mZnNldDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYExleGVyIEVycm9yOiAke21lc3NhZ2V9IGF0IGNvbHVtbiAke3Bvc2l0aW9ufSBpbiBleHByZXNzaW9uIFske3RoaXMuaW5wdXR9XWApO1xuICB9XG59XG5cbnZhciBPUEVSQVRPUlMgPSBbXG4gICd1bmRlZmluZWQnLFxuICAnbnVsbCcsXG4gICd0cnVlJyxcbiAgJ2ZhbHNlJyxcbiAgJysnLFxuICAnLScsXG4gICcqJyxcbiAgJy8nLFxuICAnJScsXG4gICdeJyxcbiAgJz0nLFxuICAnPT0nLFxuICAnPT09JyxcbiAgJyE9JyxcbiAgJyE9PScsXG4gICc8JyxcbiAgJz4nLFxuICAnPD0nLFxuICAnPj0nLFxuICAnJiYnLFxuICAnfHwnLFxuICAnJicsXG4gICd8JyxcbiAgJyEnLFxuICAnPycsXG5dO1xuXG52YXIgJEVPRiAgICAgICA9IDA7XG52YXIgJFRBQiAgICAgICA9IDk7XG52YXIgJExGICAgICAgICA9IDEwO1xudmFyICRWVEFCICAgICAgPSAxMTtcbnZhciAkRkYgICAgICAgID0gMTI7XG52YXIgJENSICAgICAgICA9IDEzO1xudmFyICRTUEFDRSAgICAgPSAzMjtcbnZhciAkQkFORyAgICAgID0gMzM7XG52YXIgJERRICAgICAgICA9IDM0O1xudmFyICQkICAgICAgICAgPSAzNjtcbnZhciAkUEVSQ0VOVCAgID0gMzc7XG52YXIgJEFNUEVSU0FORCA9IDM4O1xudmFyICRTUSAgICAgICAgPSAzOTtcbnZhciAkTFBBUkVOICAgID0gNDA7XG52YXIgJFJQQVJFTiAgICA9IDQxO1xudmFyICRTVEFSICAgICAgPSA0MjtcbnZhciAkUExVUyAgICAgID0gNDM7XG52YXIgJENPTU1BICAgICA9IDQ0O1xudmFyICRNSU5VUyAgICAgPSA0NTtcbnZhciAkUEVSSU9EICAgID0gNDY7XG52YXIgJFNMQVNIICAgICA9IDQ3O1xudmFyICRDT0xPTiAgICAgPSA1ODtcbnZhciAkU0VNSUNPTE9OID0gNTk7XG52YXIgJExUICAgICAgICA9IDYwO1xudmFyICRFUSAgICAgICAgPSA2MTtcbnZhciAkR1QgICAgICAgID0gNjI7XG52YXIgJFFVRVNUSU9OICA9IDYzO1xuXG52YXIgJDAgPSA0ODtcbnZhciAkOSA9IDU3O1xuXG52YXIgJEEgPSA2NTtcbnZhciAkRSA9IDY5O1xudmFyICRaID0gOTA7XG5cbnZhciAkTEJSQUNLRVQgID0gOTE7XG52YXIgJEJBQ0tTTEFTSCA9IDkyO1xudmFyICRSQlJBQ0tFVCAgPSA5MztcbnZhciAkQ0FSRVQgICAgID0gOTQ7XG52YXIgJF8gICAgICAgICA9IDk1O1xuXG52YXIgJGEgPSA5NztcbnZhciAkZSA9IDEwMTtcbnZhciAkZiA9IDEwMjtcbnZhciAkbiA9IDExMDtcbnZhciAkciA9IDExNDtcbnZhciAkdCA9IDExNjtcbnZhciAkdSA9IDExNztcbnZhciAkdiA9IDExODtcbnZhciAkeiA9IDEyMjtcblxudmFyICRMQlJBQ0UgPSAxMjM7XG52YXIgJEJBUiAgICA9IDEyNDtcbnZhciAkUkJSQUNFID0gMTI1O1xudmFyICROQlNQICAgPSAxNjA7XG5cbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjb2RlKSB7XG4gIHJldHVybiAoY29kZSA+PSAkVEFCICYmIGNvZGUgPD0gJFNQQUNFKSB8fCAoY29kZSA9PT0gJE5CU1ApO1xufVxuXG5mdW5jdGlvbiBpc0lkZW50aWZpZXJTdGFydChjb2RlKSB7XG4gIHJldHVybiAoJGEgPD0gY29kZSAmJiBjb2RlIDw9ICR6KVxuICAgICAgfHwgKCRBIDw9IGNvZGUgJiYgY29kZSA8PSAkWilcbiAgICAgIHx8IChjb2RlID09PSAkXylcbiAgICAgIHx8IChjb2RlID09PSAkJCk7XG59XG5cbmZ1bmN0aW9uIGlzSWRlbnRpZmllclBhcnQoY29kZSkge1xuICByZXR1cm4gKCRhIDw9IGNvZGUgJiYgY29kZSA8PSAkeilcbiAgICAgIHx8ICgkQSA8PSBjb2RlICYmIGNvZGUgPD0gJFopXG4gICAgICB8fCAoJDAgPD0gY29kZSAmJiBjb2RlIDw9ICQ5KVxuICAgICAgfHwgKGNvZGUgPT09ICRfKVxuICAgICAgfHwgKGNvZGUgPT09ICQkKTtcbn1cblxuZnVuY3Rpb24gaXNEaWdpdChjb2RlKSB7XG4gIHJldHVybiAoJDAgPD0gY29kZSAmJiBjb2RlIDw9ICQ5KTtcbn1cblxuZnVuY3Rpb24gaXNFeHBvbmVudFN0YXJ0KGNvZGUpIHtcbiAgcmV0dXJuIChjb2RlID09PSAkZSB8fCBjb2RlID09PSAkRSk7XG59XG5cbmZ1bmN0aW9uIGlzRXhwb25lbnRTaWduKGNvZGUpIHtcbiAgcmV0dXJuIChjb2RlID09PSAkTUlOVVMgfHwgY29kZSA9PT0gJFBMVVMpO1xufVxuXG5mdW5jdGlvbiB1bmVzY2FwZShjb2RlKSB7XG4gIHN3aXRjaChjb2RlKSB7XG4gICAgY2FzZSAkbjogcmV0dXJuICRMRjtcbiAgICBjYXNlICRmOiByZXR1cm4gJEZGO1xuICAgIGNhc2UgJHI6IHJldHVybiAkQ1I7XG4gICAgY2FzZSAkdDogcmV0dXJuICRUQUI7XG4gICAgY2FzZSAkdjogcmV0dXJuICRWVEFCO1xuICAgIGRlZmF1bHQ6IHJldHVybiBjb2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB0aHJvdyBtZXNzYWdlIHx8IFwiQXNzZXJ0aW9uIGZhaWxlZFwiO1xuICB9XG59XG4iXX0= |